package script

import (
	"fmt"
	"gitee.com/freedom_feel/gui-bos-api/cmd/initialize/client"
	"gitee.com/freedom_feel/gui-bos-api/cmd/logic"
	"gitee.com/freedom_feel/gui-bos-api/common"
	_type "gitee.com/freedom_feel/gui-bos-api/common/type"
	"gitee.com/freedom_feel/gui-bos-api/global"
	"gitee.com/freedom_feel/gui-bos-api/logs"
	"gitee.com/freedom_feel/gui-bos-api/models"
	"github.com/bytedance/sonic"
	"github.com/robfig/cron/v3"
	"go.uber.org/zap"
	"strconv"
	"time"
)

type CronObj struct {
	CronCtx *cron.Cron
	Log     *zap.Logger
}

// 定时任务
func (c *CronObj) SetTimeTask() {
	t := time.Now()                                                        // 获取当前时间
	fmt.Println(fmt.Sprintf("当前时间：%s\n", t.Format("2006-01-02 15:04:05"))) // 格式化时间输出
	// 添加一个每两分钟执行一次的定时任务
	//addFunc, err := c.CronCtx.AddFunc("*/1 * * * *", func() {
	//	c.Log.Info(fmt.Sprintf("定时任务执行：", time.Now().Format("2006-01-02 15:04:05")))
	//})
	// 添加一个每两分钟执行一次的定时任务
	addFunc1, err := c.CronCtx.AddFunc("*/1 * * * *", func() {
		logs.Info("第一个定时任务.接到任务,开始处理")
		// 逐个获取有序集合中的元素
		var start int64 = 0
		for {
			value, nextStart, err := client.GetNextElement(global.My_zset, start)
			if err != nil {
				if err.Error() == "no more elements" {
					logs.Error(err.Error())
					_type.ErrChan <- *_type.ErrOther("All elements have been retrieved.")
					break
				}
				logs.Error(err.Error())
				fmt.Println(fmt.Sprintf("Failed to get next element:%v", err))
				return
			}
			fmt.Println(fmt.Sprintf("Retrieved element: %s\n", value))
			err = client.RemoveFromZSet(global.My_zset, value)
			if err != nil {
				logs.Error(err.Error())
				_type.ErrChan <- *_type.ErrOther("redis remove key filed")
				break
			}
			var cb models.PmCityDB
			sonic.Unmarshal([]byte(value), &cb)
			_, _, _ = logic.FindOne(cb)
			start = nextStart
		}
	})
	addFunc2, err := c.CronCtx.AddFunc("0 0 * * *", func() {
		logs.Info("第二个定时任务.接到任务,开始处理")
		logs.Info("第二个定时任务.接到任务,处理中...")
		for {
			if client.RedisExist(global.PwdCount) {
				logs.Info("存在：" + global.PwdCount)
				//一个一个 取
				key, err1 := client.LGetList(global.PwdCount)
				if err1 != nil {
					logs.Error(err1.Error())
					_type.ErrChan <- *_type.ErrOther("第二个:" + err1.Error())
					break
				}
				logs.Info(fmt.Sprintf("取出数据：%v", key))
				//一个一个 删
				if !client.RedisDel(key) {
					logs.Error("删除失败")
				}
				logs.Error("删除成功")
			}
			if client.RedisExist(string(global.CountKey)) {
				logs.Info("存在：" + string(global.CountKey))
				//一个一个 取
				key, err1 := client.LGetList(string(global.CountKey))
				if err1 != nil {
					logs.Error(err1.Error())
					_type.ErrChan <- *_type.ErrOther("第二个:" + err1.Error())
					break
				}
				logs.Info(fmt.Sprintf("取出数据：%v", key))
				//一个一个 删
				if !client.RedisDel(key) {
					logs.Error("删除失败")
				}
				logs.Info("删除成功")
			} else {
				break
			}

		}
		logs.Info("第二个定时任务.接到任务,处理成功")
	})
	addFunc3, err := c.CronCtx.AddFunc("0 0 * * *", func() {
		logs.Info("第三个定时任务.接到任务,开始处理")
		//增加一个刷新 key
		all, err1 := client.GetUserAll()
		if err1 != nil {
			logs.Error(err.Error())
			_type.ErrChan <- *_type.ErrOther(err1.Error())
			return
		}
		logs.Info("第三个定时任务.接到任务,处理中...")
		for _, user := range all {
			days := common.StrToInt(user.DaysCount)
			days += 1
			err = client.UpdateDC(strconv.Itoa(int(user.UserId)), common.IntToStr(days))
			if err != nil {
				logs.Error(err.Error())
				_type.ErrChan <- *_type.ErrOther(err1.Error())
				return
			}
		}
		logs.Info("第三个定时任务.接到任务,处理完成")
		return
	})
	if err != nil {
		logs.Error(err.Error())
		_type.ErrChan <- *_type.ErrSystem(fmt.Sprintf("添加定时任务失败：%v", err))
		return
	}
	//fmt.Println("定时任务添加成功，标识：", addFunc)
	logs.Info(fmt.Sprintf("定时任务添加成功，标识：%v", addFunc1))
	logs.Info(fmt.Sprintf("定时任务添加成功，标识：%v", addFunc2))
	logs.Info(fmt.Sprintf("定时任务添加成功，标识：%v", addFunc3))

	c.CronCtx.Start() // 启动 cron 调度器

	//select {} // 阻塞主 goroutine，以保持程序运行
}
